using UnityEngine;
using System;
using System.Reflection;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;

namespace Super
{
	public static class InitUtil
	{
		/// <summary>
		/// 如果这是游戏的第一帧（即启动时），这个方法会在第一个场景完全加载完成后立即执行
		/// 这个方法不会在场景切换过程中执行，而是在新场景完全加载完毕后才会被调用
		/// 这个方法会在场景中所有awake调用之后调用
		/// </summary>
		[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
		private static void OnGameLoadInit()
		{
			InputManager.Ins.Init();
			TimerManager.Ins.Init();
			LangManager.Ins.Init();
			VirtualCM2DManager.Ins.Init();
			InitManager();
		}

		/// <summary>
		/// 当游戏出现闪图，也就是unity启动画面后
		/// </summary>
		[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
		private static void OnBeforeSplashScreen()
		{
#if UNITY_STANDALONE_WIN
			if (ValueSettingSO.Ins.Borderless)
			{
				WindowUtil.RemoveBorder();
			}

			if (ValueSettingSO.Ins.BlackTransparency)
			{
				WindowUtil.SetColorAlpha(new Color(0, 0, 0, 0));
			}
#endif
		}

		public static void InitManager()
		{
			Type[] types = typeof(SimpleSingle<>).Assembly.GetTypes();
			foreach (var type in types)
			{
				if (type.IsAbstract || type.IsInterface || type.IsGenericType) continue;
				if (type.BaseType == null || !type.BaseType.IsGenericType) continue;
				if (type.BaseType.GetGenericTypeDefinition() != typeof(SimpleSingle<>)) continue;

				MethodInfo methodInfo = type.BaseType.GetMethod("Initialize");
				methodInfo.Invoke(null, null);
			}
		}
	}

}
